/**
 * 分享卡片生成工具
 * 使用Canvas生成动态分享图，适用于小程序分享给朋友或群聊的场景
 */

// 分享卡片配置
const SHARE_CARD_CONFIG = {
  // Canvas尺寸（建议使用5:4比例，适合分享卡片）
  width: 750,
  height: 600,
  // 基础图路径
  baseImage: "/static/images/shareBase.png",
  // 文字配置
  text: {
    title: {
      fontSize: 76,
      fontWeight: "bold",
      color: "#333333",
      maxWidth: 600,
      lineHeight: 80
    },
    subtitle: {
      fontSize: 36,
      fontWeight: "bold",
      // fontFamily: "Alimama ShuHeiTi",
      color: "#333333",
      maxWidth: 600,
      lineHeight: 40
    },
    detail: {
      fontSize: 24,
      color: "#333333",
      maxWidth: 600,
      lineHeight: 36
    }
  },
  // 布局配置
  layout: {
    padding: 40,
    titleTop: 80,
    contentTop: 160,
    lineSpacing: 20
  }
};

/**
 * 绘制文字（支持自动换行）
 * @param {CanvasContext} ctx Canvas上下文
 * @param {string} text 文字内容
 * @param {number} x 起始x坐标
 * @param {number} y 起始y坐标
 * @param {object} style 文字样式配置
 * @returns {number} 返回绘制后的y坐标（用于下一行）
 */
function drawText(ctx, text, x, y, style) {
  if (!text) return y;

  const fontSize = style.fontSize || 24;
  const color = style.color || "#333333";
  const maxWidth = style.maxWidth || 600;
  const lineHeight = style.lineHeight || fontSize * 0.5;
  const fontWeight = style.fontWeight || "normal";
  const fontFamily = style.fontFamily || "";

  ctx.setFillStyle(color);

  // 设置字体：如果有 fontFamily，使用 setFont；否则使用 setFontSize
  if (fontFamily) {
    // 小程序 Canvas 的 setFont 方法格式：fontStyle fontVariant fontWeight fontSize fontFamily
    const fontStyle = `${fontWeight} ${fontSize}px ${fontFamily}`;
    ctx.setFont(fontStyle);
  } else {
    ctx.setFontSize(fontSize);
  }

  ctx.setTextAlign("left");
  ctx.setTextBaseline("top");

  // 处理文字换行
  const words = text.split("");
  let line = "";
  let currentY = y;
  const isBold = fontWeight === "bold";

  // 绘制文字的函数（支持加粗）
  const drawLine = (lineText, xPos, yPos) => {
    if (isBold) {
      // 加粗效果：通过多次绘制并稍微偏移来实现
      ctx.fillText(lineText, xPos - 1, yPos);
      ctx.fillText(lineText, xPos + 1, yPos);
      ctx.fillText(lineText, xPos, yPos - 1);
      ctx.fillText(lineText, xPos, yPos + 1);
      ctx.fillText(lineText, xPos, yPos);
    } else {
      ctx.fillText(lineText, xPos, yPos);
    }
  };

  for (let i = 0; i < words.length; i++) {
    const testLine = line + words[i];
    const metrics = ctx.measureText(testLine);
    const testWidth = metrics.width;

    if (testWidth > maxWidth && line.length > 0) {
      // 绘制当前行
      drawLine(line, x, currentY);
      line = words[i];
      currentY += lineHeight;
    } else {
      line = testLine;
    }
  }

  // 绘制最后一行
  if (line.length > 0) {
    drawLine(line, x, currentY);
    currentY += lineHeight;
  }

  return currentY;
}

/**
 * 加载图片信息（小程序需要使用getImageInfo）
 * @param {string} src 图片路径
 * @returns {Promise<string>} 返回图片路径（本地路径或临时路径）
 */
function loadImage(src) {
  return new Promise((resolve, reject) => {
    // 对于网络图片，需要先下载
    if (src.startsWith("http://") || src.startsWith("https://")) {
      wx.downloadFile({
        url: src,
        success: (res) => {
          if (res.statusCode === 200) {
            resolve(res.tempFilePath);
          } else {
            reject(new Error("下载图片失败"));
          }
        },
        fail: (err) => {
          reject(err);
        }
      });
    } else {
      // 对于本地图片，使用getImageInfo验证并获取图片信息
      // 这样可以确保图片存在，并且可以获取图片尺寸等信息
      wx.getImageInfo({
        src: src,
        success: (res) => {
          // 返回原始路径，Canvas可以直接使用本地路径
          resolve(src);
        },
        fail: (err) => {
          console.error("获取图片信息失败:", err);
          reject(err);
        }
      });
    }
  });
}

/**
 * 生成分享卡片
 * @param {string} type 类型：'ticket' | 'carpool' | 'room'
 * @param {object} data 数据对象
 * @returns {Promise<string>} 返回生成的图片临时路径
 */
function generateShareCard(type, data) {
  return new Promise((resolve, reject) => {
    const ctx = wx.createCanvasContext("shareCardCanvas");
    const config = SHARE_CARD_CONFIG;

    // 加载基础图
    loadImage(config.baseImage)
      .then((baseImagePath) => {
        // 绘制基础图（使用图片路径）
        ctx.drawImage(baseImagePath, 0, 0, config.width, config.height);

        // 根据类型绘制不同内容
        let currentY = 20;
        const padding = config.layout.padding;
        const x = padding;

        if (type === "ticket") {
          // 雪票分享卡片
          currentY = drawTicketContent(ctx, data, x, currentY, config);
        } else if (type === "carpool") {
          // 拼车分享卡片
          currentY = drawCarpoolContent(ctx, data, x, currentY, config);
        } else if (type === "room") {
          // 拼房分享卡片
          currentY = drawRoomContent(ctx, data, x, currentY, config);
        }

        // 绘制完成，生成图片
        ctx.draw(false, () => {
          // 延迟一下确保绘制完成
          setTimeout(() => {
            wx.canvasToTempFilePath({
              canvasId: "shareCardCanvas",
              success: (res) => {
                resolve(res.tempFilePath);
              },
              fail: (err) => {
                console.error("生成分享卡片失败:", err);
                reject(err);
              }
            });
          }, 500);
        });
      })
      .catch((err) => {
        console.error("加载基础图失败:", err);
        reject(err);
      });
  });
}

/**
 * 绘制雪票内容
 */
function drawTicketContent(ctx, data, x, startY, config) {
  let currentY = startY;
  const layout = config.layout;
  const textStyle = config.text;

  // 标题：雪票类型 + 雪场名称
  const title = `${data.type === 0 ? "求购" : "转让"}`;

  // 获取isFull字段用于显示小块
  const isFullValue = data.isFull;

  // 测量title第一行宽度，用于定位右侧的isFull小块
  const titleFontSize = textStyle.title.fontSize || 76;
  const titleMaxWidth = textStyle.title.maxWidth || 600;

  // 设置字体以测量宽度
  ctx.setFontSize(titleFontSize);

  // 计算title第一行的实际宽度（考虑换行）
  let titleFirstLine = "";
  let titleWidth = 0;
  if (title) {
    const words = title.split("");
    for (let i = 0; i < words.length; i++) {
      const testLine = titleFirstLine + words[i];
      const metrics = ctx.measureText(testLine);
      if (metrics.width > titleMaxWidth && titleFirstLine.length > 0) {
        break;
      }
      titleFirstLine = testLine;
    }
    const metrics = ctx.measureText(titleFirstLine);
    titleWidth = metrics.width;
  }

  // 绘制title
  currentY = drawText(ctx, title, x, currentY, textStyle.title);

  // 在title右侧绘制isFull小块（紧挨着title，无间距）
  if (isFullValue !== undefined && isFullValue !== null) {
    const isFullText = isFullValue === 1 ? "整票" : "残票";
    const blockWidth = 60;
    const blockHeight = 28;
    const blockX = x + titleWidth; // 紧挨着title，无间距

    // 计算baseline对齐：title使用top对齐（setTextBaseline("top")）
    // 对于中文字体，baseline位置约为startY + fontSize * 0.85
    // 小块的垂直中心应该与title的baseline对齐
    const titleBaseline = startY + titleFontSize * 0.85;
    const blockY = titleBaseline - blockHeight / 2;

    // 绘制背景矩形
    ctx.setFillStyle("#E7F4FF");
    ctx.fillRect(blockX, blockY, blockWidth, blockHeight);

    // 绘制文字
    ctx.setFillStyle("#0E61A4");
    ctx.setFontSize(16);
    ctx.setTextAlign("center");
    ctx.setTextBaseline("middle");
    // 文字居中：x坐标 = blockX + blockWidth / 2, y坐标 = blockY + blockHeight / 2
    ctx.fillText(isFullText, blockX + blockWidth / 2, blockY + blockHeight / 2);

    // 恢复文字对齐方式
    ctx.setTextAlign("left");
    ctx.setTextBaseline("top");
  }

  currentY += layout.lineSpacing;

  // 副标题：日期和时间段
  const dateText = data.date ? `${data.date}` : "";
  const timeSlotText = getTimeSlotText(data.timeSlot);
  const subtitle = [dateText, timeSlotText].filter(Boolean).join(" | ");
  if (subtitle) {
    currentY = drawText(ctx, subtitle, x, currentY, textStyle.subtitle);
    currentY += layout.lineSpacing;
  }

  // 详情：票类型和数量

    currentY = drawText(
      ctx,
      data.skiResort?.name,
      x,
      currentY,
      textStyle.detail
    );
    currentY += layout.lineSpacing;


  return currentY;
}

/**
 * 绘制拼车内容
 */
function drawCarpoolContent(ctx, data, x, startY, config) {
  let currentY = startY;
  const layout = config.layout;
  const textStyle = config.text;

  // 标题：行程类型
  const title = data.tripInfo?.serviceType || "";
  currentY = drawText(ctx, title, x, currentY, textStyle.title);
  currentY += layout.lineSpacing;

  // 副标题：服务类型和时间
  const time = data.tripInfo?.time || "";
  const subtitle = time;
  if (subtitle) {
    currentY = drawText(ctx, subtitle, x, currentY, textStyle.subtitle);
    currentY += layout.lineSpacing;
  }

  // 出发地和目的地
  const departure = data.tripInfo?.departure || "";
  const destination = data.tripInfo?.destination || "";
  if (departure) {
    currentY = drawText(ctx, `出发：${departure}`, x, currentY, textStyle.detail);
    currentY += layout.lineSpacing;
  }
  if (destination) {
    currentY = drawText(ctx, `到达：${destination}`, x, currentY, textStyle.detail);
    currentY += layout.lineSpacing;
  }

  return currentY;
}

/**
 * 绘制拼房内容
 */
function drawRoomContent(ctx, data, x, startY, config) {
  let currentY = startY;
  const layout = config.layout;
  const textStyle = config.text;

  // 标题：拼房类型
  const title = data.roomInfo?.serviceType || "";

  // 获取ski字段（可能来自roomInfo或homeInfo）
  const skiValue = data.roomInfo?.ski;
  console.log("🚀 ~ drawRoomContent ~ skiValue:", skiValue);

  // 测量title第一行宽度，用于定位右侧的ski小块
  const titleFontSize = textStyle.title.fontSize || 76;
  const titleMaxWidth = textStyle.title.maxWidth || 600;
  const titleLineHeight = textStyle.title.lineHeight || 80;

  // 设置字体以测量宽度
  ctx.setFontSize(titleFontSize);

  // 计算title第一行的实际宽度（考虑换行）
  let titleFirstLine = "";
  let titleWidth = 0;
  if (title) {
    const words = title.split("");
    for (let i = 0; i < words.length; i++) {
      const testLine = titleFirstLine + words[i];
      const metrics = ctx.measureText(testLine);
      if (metrics.width > titleMaxWidth && titleFirstLine.length > 0) {
        break;
      }
      titleFirstLine = testLine;
    }
    const metrics = ctx.measureText(titleFirstLine);
    titleWidth = metrics.width;
  }

  // 绘制title
  currentY = drawText(ctx, title, x, currentY, textStyle.title);

  // 在title右侧绘制ski小块（紧挨着title，无间距）
  if (skiValue !== undefined) {
    const skiText = skiValue === 1 ? "住滑" : "单房";
    const blockWidth = 60;
    const blockHeight = 28;
    const blockX = x + titleWidth; // 紧挨着title，无间距

    // 计算baseline对齐：title使用top对齐（setTextBaseline("top")）
    // 对于中文字体，baseline位置约为startY + fontSize * 0.85
    // 小块的垂直中心应该与title的baseline对齐
    const titleBaseline = startY + titleFontSize * 0.85;
    const blockY = titleBaseline - blockHeight / 2;

    // 绘制背景矩形
    ctx.setFillStyle("#E7F4FF");
    ctx.fillRect(blockX, blockY, blockWidth, blockHeight);

    // 绘制文字
    ctx.setFillStyle("#0E61A4");
    ctx.setFontSize(16);
    ctx.setTextAlign("center");
    ctx.setTextBaseline("middle");
    // 文字居中：x坐标 = blockX + blockWidth / 2, y坐标 = blockY + blockHeight / 2
    ctx.fillText(skiText, blockX + blockWidth / 2, blockY + blockHeight / 2);

    // 恢复文字对齐方式
    ctx.setTextAlign("left");
    ctx.setTextBaseline("top");
  }

  currentY += layout.lineSpacing;

  // 副标题：服务类型和时间
  const time = data.roomInfo?.time || "";
  const subtitle = time;
  if (subtitle) {
    currentY = drawText(ctx, subtitle, x, currentY, textStyle.subtitle);
    currentY += layout.lineSpacing;
  }

  // 地址和房型
  const address = data.roomInfo?.address || "";
  const roomType = data.roomInfo?.roomType || "";
  if (address) {
    currentY = drawText(ctx, `地址：${address}`, x, currentY, textStyle.detail);
    currentY += layout.lineSpacing;
  }
  return currentY;
}

/**
 * 获取时间段文本
 */
function getTimeSlotText(timeSlot) {
  const timeSlotMap = {
    0: "全天",
    1: "上午",
    2: "下午",
    3: "夜场"
  };
  return timeSlotMap[timeSlot] || "";
}

/**
 * 获取票类型文本
 */
function getTicketTypeText(ticketType) {
  const ticketTypeMap = {
    0: "1日票",
    1: "1.5日票",
    2: "2日票",
    3: "多日票"
  };
  return ticketTypeMap[ticketType] || "";
}

/**
 * 创建隐藏的Canvas用于生成分享图
 * 注意：需要在页面中有一个隐藏的canvas元素，id为'shareCardCanvas'
 * 或者使用离屏Canvas（需要基础库2.9.0+）
 */
function createShareCardCanvas() {
  // 检查是否已存在canvas
  // 如果不存在，需要在页面中动态创建
  // 这里返回一个Promise，确保canvas准备就绪
  return new Promise((resolve) => {
    // 使用查询选择器检查canvas是否存在
    const query = wx.createSelectorQuery();
    query
      .select("#shareCardCanvas")
      .fields({ node: true, size: true })
      .exec((res) => {
        if (res[0]) {
          resolve();
        } else {
          // Canvas不存在，需要创建
          // 注意：小程序中需要在wxml中声明canvas
          console.warn(
            "Canvas元素不存在，请确保页面中有id为shareCardCanvas的canvas元素"
          );
          resolve();
        }
      });
  });
}

/**
 * 生成分享卡片（简化版，使用系统分享）
 * 如果Canvas生成失败，返回基础图作为备选
 * @param {string} type 类型：'ticket' | 'carpool' | 'room'
 * @param {object} data 数据对象
 * @returns {Promise<object>} 返回分享配置对象 { title, path, imageUrl }
 */
async function getShareCard(type, data) {
  try {
    // 确保Canvas准备就绪
    await createShareCardCanvas();

    // 生成分享卡片
    const imageUrl = await generateShareCard(type, data);

    // 生成分享标题和路径
    const shareConfig = getShareConfig(type, data);
    shareConfig.imageUrl = imageUrl;

    return shareConfig;
  } catch (error) {
    console.error("生成分享卡片失败:", error);
    // 失败时返回基础配置，使用基础图
    const shareConfig = getShareConfig(type, data);
    shareConfig.imageUrl = SHARE_CARD_CONFIG.baseImage;
    return shareConfig;
  }
}

/**
 * 获取分享配置（标题和路径）
 */
function getShareConfig(type, data) {
  let title = "";
  let path = "";

  if (type === "ticket") {
    title = `拼车拼房拼雪票，加入俱乐部社群更有专属福利！`;
    path = `/pages/ticketDetail/ticketDetail?id=${data.id}`;
  } else if (type === "carpool") {
    title = `拼车拼房拼雪票，加入俱乐部社群更有专属福利！`;
    path = `/pages/carpoolDetail/carpoolDetail?id=${data.id || data.carpoolId}`;
  } else if (type === "room") {
    title = `拼车拼房拼雪票，加入俱乐部社群更有专属福利！`;
    path = `/pages/roomSharingDetail/roomSharingDetail?id=${
      data.id || data.roomSharingId
    }`;
  }

  return {
    title: title || "滑雪去小程序",
    path: path || "/pages/index/index"
  };
}

module.exports = {
  generateShareCard,
  getShareCard,
  getShareConfig,
  SHARE_CARD_CONFIG
};
